#include <asm/regdef.h>
//#include <asm/cp0regdef.h>
#include <asm/asm.h>
#include <mmu.h>
#include <trap.h>
	.data

	.p2align 12

	.globl fsipcbuf
fsipcbuf:
	.space 4096
	.globl fdtab
fdtab:
	.space 4096


	.globl envs
envs:
	.quad UENVS

	.globl pages
pages:
	.quad UPAGES

	.globl vpt
vpt:
	.quad UVPT

	.globl vpd
vpd:
	.quad (UVPT+(UVPT>>12)*4)

	.globl __pgfault_handler
	__pgfault_handler:
	.quad 0


	.extern libmain

	.text
	.globl _start
_start:
/*	//1: j 1b
	lw	a0, 0(sp)
	lw	a1, 4(sp)
	//sw	a0, -4(sp)
	//sw	a1, -0(sp)
nop
	jal	libmain
	nop

.set noreorder*/
	call	libmain
.text
.globl __asm_pgfault_handler
__asm_pgfault_handler:
	ld	a0,	TF_TVAL(sp)
	ld	t1,	__pgfault_handler
	jalr	t1
	nop
	li	a0, 0x123
	move	a1, ra
	ld	a1,TF_EPC(sp)
//	call	DEBUG_TEST2_OUT
/*	call	DEBUG_TEST3_OUT
	call	DEBUG_TEST4_OUT
	call	DEBUG_TEST5_OUT
	call	DEBUG_TEST6_OUT
	call	DEBUG_TEST7_OUT
	call	DEBUG_TEST8_OUT
	call	DEBUG_TEST9_OUT*/
//	ld	v1,TF_LO(sp)                                       
//	mtlo	v1                               
//	lw	v0,TF_HI(sp)                                         
	ld	t1,TF_EPC(sp)
//	csrrw	t1, sepc, t1
	//csrrw	t1, uepc, t1
	ld	x31,TF_REG31(sp)
	ld	x30,TF_REG30(sp)
	ld	x29,TF_REG29(sp)
	ld	x28,TF_REG28(sp)
	ld	x27,TF_REG27(sp)
	ld	x26,TF_REG26(sp)
	ld	x25,TF_REG25(sp)
	ld	x24,TF_REG24(sp)
	ld	x23,TF_REG23(sp)
	ld	x22,TF_REG22(sp)
	ld	x21,TF_REG21(sp)
	ld	x20,TF_REG20(sp)
	ld	x19,TF_REG19(sp)
	ld	x18,TF_REG18(sp)
	ld	x17,TF_REG17(sp)
	ld	x16,TF_REG16(sp)
	ld	x15,TF_REG15(sp)
	ld	x14,TF_REG14(sp)
	ld	x13,TF_REG13(sp)
	ld	x12,TF_REG12(sp)
	ld	x11,TF_REG11(sp)
	ld	x10,TF_REG10(sp)
	ld	x9,TF_REG9(sp)
	ld	x8,TF_REG8(sp)
	ld	x7,TF_REG7(sp)
	ld	x6,TF_REG6(sp)
	ld	x5,TF_REG5(sp)
	ld	x4,TF_REG4(sp)
	ld	x3,TF_REG3(sp)
	ld	x1,TF_REG1(sp)
	ld	t6,TF_EPC(sp)
	ld	x2,TF_REG2(sp)
//	call	DEBUG_TEST4_OUT
	jr	t6
//	uret
//	sret
//	ld	k0,TF_EPC(sp) 	//atomic operation needed 
//	jr	k0			//
//	ld	sp,TF_REG29(sp)  *//* Deallocate stack */ 
/*
	// save the caller-save registers
	//	(your code here)
//1: j 1b
nop
	lw	a0, TF_BADVADDR(sp)
	//sw	t0, (sp)
	//subu	sp,16
	lw	t1, __pgfault_handler
	jalr	t1

nop
	// push trap-time eip, eflags onto trap-time stack
	//	(your code here)
	//addu	sp,16
	lw	v1,TF_LO(sp)                                       
		mtlo	v1                               
		lw	v0,TF_HI(sp)                                         
		lw	v1,TF_EPC(sp)                    
		mthi	v0                               
		mtc0	v1,CP0_EPC                                             
		lw	$31,TF_REG31(sp)                 
		lw	$30,TF_REG30(sp)                 
		lw	$28,TF_REG28(sp)                 
		lw	$25,TF_REG25(sp)                 
		lw	$24,TF_REG24(sp)                 
		lw	$23,TF_REG23(sp)                 
		lw	$22,TF_REG22(sp)                 
		lw	$21,TF_REG21(sp)                 
		lw	$20,TF_REG20(sp)                 
		lw	$19,TF_REG19(sp)                 
		lw	$18,TF_REG18(sp)                 
		lw	$17,TF_REG17(sp)                 
		lw	$16,TF_REG16(sp)                 
		lw	$15,TF_REG15(sp)                 
		lw	$14,TF_REG14(sp)                 
		lw	$13,TF_REG13(sp)                 
		lw	$12,TF_REG12(sp)                 
		lw	$11,TF_REG11(sp)                 
		lw	$10,TF_REG10(sp)                 
		lw	$9,TF_REG9(sp)                   
		lw	$8,TF_REG8(sp)                   
		lw	$7,TF_REG7(sp)                   
		lw	$6,TF_REG6(sp)                   
		lw	$5,TF_REG5(sp)                   
		lw	$4,TF_REG4(sp)                   
		lw	$3,TF_REG3(sp)                   
		lw	$2,TF_REG2(sp)                   
		lw	$1,TF_REG1(sp) 
		lw	k0,TF_EPC(sp) 	//atomic operation needed 
		jr	k0			//
		lw	sp,TF_REG29(sp)  *//* Deallocate stack */  

